package 泛型;

import java.util.ArrayList;

class Algoritm< T extends Comparable<T> > {
    //构造一个 泛型类
    public T findMax(T[] arr) {
        T max=arr[0];
        for (int i = 1; i <arr.length ; i++) {
            //if (max<arr[i]) {
                //max<arr[i] 因为 T 是一个引用类型，
                //在编译的时 T会被擦除为Object引用类型或者其他指定的各种引用类型，所以不能这样比较大小
                //引用类型比较大小，一定要实现两个接口：Comparable 或者 Comparator
                //因此我们需要给 泛型 指定边界
                //泛型的上界：T extends Comparable<T>，擦除到实现了Comparable接口的类型
                //泛型的下界：没有！！！！
            //}
                if (max.compareTo(arr[i])<0) {
                    max=arr[i];
                }
        }
        return max;
    }
}

class Algoritm2 {
    //构造一个 泛型方法
    public static< T extends Comparable<T> > T findMax(T[] arr) {
        T max=arr[0];
        for (int i = 1; i <arr.length ; i++) {

            if (max.compareTo(arr[i])<0) {
                max=arr[i];
            }
        }
        return max;
    }
}

public class Demo1 {
    //利用泛型方法 打印 list 中的所有元素
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        Test.print(list);
    }


    //利用泛型方法，求一个泛型数组中的最大值，不需要再new一个泛型类
    public static void main2(String[] args) {
        Integer[] arr={1,2,5,7,9};
        int max = Algoritm2.findMax(arr);
        //在 findMax() 中会根据形参arr的类型 推导出整个泛型T的类型参数
        System.out.println(max);

    }


    //利用泛型类，求一个泛型数组中的最大值
    public static void main1(String[] args) {
        Algoritm<Integer> algoritm=new Algoritm<>();//因为是泛型类，所以使用时需要先new对象
        Integer[] arr={1,2,5,7,9};
        int max = algoritm.findMax(arr);
        System.out.println(max);
    }


}

class Test{
    //这个泛型方法 用来打印 list 中的所有元素
    public static<T> void print(ArrayList<T> list) {
        for (T t: list) {
            System.out.println(t);
        }
    }

    //这个泛型方法 用来打印 list 中的所有元素
    // ? 代表通配符
    public static<T> void print2(ArrayList<?> list) {
        for (Object t: list) {
            System.out.println(t);
        }
    }

}